package manager.cart.service.impl;
import manager.auth.vo.UserInfo;
import manager.cart.service.CartService;
import manager.cart.vo.CartItem;
import manager.cart.vo.CartVO;
import manager.config.AuthInteceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class CartServiceImpl implements CartService {
    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public CartVO getCartByUserName(List<String> skuIds) {
         UserInfo userInfo= AuthInteceptor.getUserInfo();
         CartVO cartVO =(CartVO)redisTemplate.boundValueOps(userInfo.getUsername()).get();
         if(cartVO==null){
             return new CartVO();
         }
         Long  totalAmount=0L;
         for(CartItem item:cartVO.getCartItems()){
            item.setTotalPrice(item.getPrice()*item.getQty());
            totalAmount=totalAmount+item.getPrice()*item.getQty();
         };
         cartVO.setTotalPrice(totalAmount);
         List<CartItem> cartItems=new ArrayList<CartItem>();
         if(skuIds.size()>0){
             cartVO.getCartItems().forEach(item->{
                 List<String> currentSkuIds=skuIds.stream().filter(skuId->skuId.equals(item.getSkuId())).collect(Collectors.toList());
                 if(currentSkuIds.size()>0){
                     cartItems.add(item);
                 }
             });
             cartVO.setCartItems(cartItems);
         }
         return cartVO;
    }

    @Override
    public CartVO addCart(CartItem cartItem) {
            UserInfo userInfo= AuthInteceptor.getUserInfo();
            CartVO cartVO =(CartVO)redisTemplate.boundValueOps(userInfo.getUsername()).get();
            List<CartItem> cartItems=new ArrayList<>();
            if(cartVO==null||cartVO.equals(null)){
                cartVO=new CartVO();
                cartVO.setUserInfo(userInfo);
                cartItems.add(cartItem);
                cartVO.setCartItems(cartItems);
                redisTemplate.boundValueOps(userInfo.getUsername()).set(cartVO);
            }
            cartItems=cartVO.getCartItems();
            List<CartItem> currentCartItem=cartItems.stream().filter(item->item.getSkuId().equals(cartItem.getSkuId())).collect(Collectors.toList());
            CartItem curItem=null;
            if(currentCartItem.size()>0){
                curItem=currentCartItem.get(0);
            }
            if(curItem!=null){
                curItem.setQty(curItem.getQty()+cartItem.getQty());
            }
            if(curItem==null){
                cartItems.add(cartItem);
                cartVO.setCartItems(cartItems);
            }
            redisTemplate.boundValueOps(userInfo.getUsername()).set(cartVO);
            return cartVO;
    }

    @Override
    public void deleteCart(List<CartItem> cartItemList) {
         UserInfo userInfo= AuthInteceptor.getUserInfo();
         CartVO cartVO =(CartVO)redisTemplate.boundValueOps(userInfo.getUsername()).get();
         List<CartItem> newCartItems=new ArrayList<>();
         cartVO.getCartItems().forEach(item->{
               List<CartItem> data=cartItemList.stream().filter(curItem->curItem.getSkuId().equals(item.getSkuId())).collect(Collectors.toList());
                   if(data.size()==0){
                   newCartItems.add(item);
               }
         });
        cartVO.setCartItems(newCartItems);
        redisTemplate.boundValueOps(userInfo.getUsername()).set(cartVO);
    }

    @Override
    public void updateCartItemBySku(CartItem cartItem) {
         UserInfo userInfo= AuthInteceptor.getUserInfo();
         CartVO cartVO =(CartVO)redisTemplate.boundValueOps(userInfo.getUsername()).get();
         cartVO.getCartItems().forEach(item->{
            if(cartItem.getSkuId().equals(item.getSkuId())){
                item.setQty(cartItem.getQty());
            }
        });
        redisTemplate.boundValueOps(userInfo.getUsername()).set(cartVO);
    }
}
